package com.tedu.egweibo.common.exception;

import com.tedu.egweibo.common.result.JsonResult;
import com.tedu.egweibo.common.result.StatusCode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import javax.validation.ConstraintViolationException;

@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {

    @ExceptionHandler
    public JsonResult doHandleMethodArgumentNotValidException(MethodArgumentNotValidException e){
        /*
            验证框架匹配验证不通过时，抛出MethodArgumentNotValidException后
            获取的错误消息内容过于冗长，因此我们可以使用下面的方法仅获取我们在对应
            属性上进行验证注解中message指定的内容:
            例如:
            UserLoginDTO中我们在属性username上使用注解:
             @NotNull(message="用户名不能为NULL")
             private String username;

            那么这里如果验证不通过，我们在得到异常对象后通过下面方法可以得到message内容:
            e.getFieldError().getDefaultMessage()
         */
        String message = e.getFieldError().getDefaultMessage();
        log.error(message,e);
        return new JsonResult(StatusCode.VALIDATE_ERROR,message);
    }

    @ExceptionHandler
    public JsonResult doHandleConstraintViolationException(ConstraintViolationException e){
        String message = e.getMessage();//"selectWeiboDetail.id: 微博ID必须在1-9999之间"
        message = message.substring(message.indexOf(":")+1).trim();
        log.error(message,e);
        return new JsonResult(StatusCode.VALIDATE_ERROR,message);
    }

    @ExceptionHandler
    public JsonResult doHandleRuntimeException(RuntimeException e){
        log.error(e.getMessage(),e);
        return new JsonResult(StatusCode.OPERATION_FAILED);
    }
}
